iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
自我挑戰組

設計模式探索系列 第 13

[Day 13] 工廠模式 (3)

  • 分享至 

  • xImage
  •  

第六個原則

回顧一下一開始大爆炸的製作披薩寫法。如果不管怎樣的pizza,我們都在同一個pizza store裡面的orderpizza判斷各種pizza的口味,並進行判斷,它們的依賴關係就會呈現這樣:(是不是讓人回憶起裝飾器模式的飲料XD)
https://ithelp.ithome.com.tw/upload/images/20220928/20140096cMciw0OMMF.png

而設計模式很大的重點就是在降低這些依賴關係,而這也是一條設計原則: 依賴反轉原則(Dependency Inversion Principle)。

要依賴抽象,而非依賴具體類別

這跟前面提到的第二個原則─針對"介面"而非"實作"寫程式─感覺頗有異曲同工之妙,不過在依賴反轉原則中,則更強調抽象,不管是"高階物件"(用低階組件來定義行為的類別,像此例中的pizza store),或"低階組件"(此例中的pizza),都應該要依賴抽象。

從上面的圖中,可以看到PizzaStore高度依賴各種不同的pizza,而改用工廠方法模式之後,依賴關係就變成這樣:
https://ithelp.ithome.com.tw/upload/images/20220928/20140096pwlkmIB79p.png
高階與低些的組件都依賴抽象出來的pizza,這就是實踐此原則的範例,反轉了!

可以藉由以下幾個檢核點來幫助達成依賴反轉的精神:

  • 不應該保存具體類別的參考在變數中
    • 關於這點,我還在揣摩作者的意思;從旁邊的說明,看來意思是在避免在類別中直接使用new來進行實例化。
  • 不應該從具體類別衍生出類別
    • 這點提到的就是應該依賴抽象介面,而不是具體類別,來反轉這種關係。
  • 不應該覆寫基底類別已實作的方法。
    • 因為這代表這個方法並非完全抽象的,在基底類別實作的方法應該是要讓所有的子類別都能共用

但切記不要矯枉過正,應該藉由這幾點來檢視有沒有更好的設計,但不是不管在哪裡都要完全地遵守,而是透過思考來判斷這些地方是否有可能變動,需要依靠這些原則來達成更靈活的設計。


上一篇
[Day 12] 工廠模式 (2)
下一篇
[Day 14] 工廠模式 (4)
系列文
設計模式探索30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言